home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok59.lha / AmokEd_V1.02b / txt / Printf.lzh / Printf / SRC / SPrintf.s < prev    next >
Text File  |  1991-01-25  |  4KB  |  131 lines

  1. ; :Program.       SPrintf.s
  2. ; :Author.        Volker Rudolph
  3. ; :Address.       Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern 26
  4. ; :Phone.         06301/8566
  5. ; :Version.       1.0
  6. ; :Date.          28.11.1989
  7. ; :Copyright.     PD
  8. ; :Language.      Assembler / Oberon
  9. ; :Translator.    A68k(Freeware) / Amiga-Oberon V1.17.1
  10. ; :Contents.      Allzweck-Textausgabe in Form der C-Funktion Printf
  11. ; :Usage.         Aufruf und Parameter wie in C
  12.  
  13. _LVORawDoFmt  EQU -522            ; Exec.RawDoFmt
  14.  
  15.   XREF OberonLib.StackChk
  16.   XDEF Printf.SPrintf0,Printf.SPrintf1,Printf.SPrintf2,Printf.SPrintf3,
  17.   XDEF Printf.SPrintf4,Printf.SPrintf5,Printf.SPrintf6,Printf_SPrintf
  18.  
  19.   SECTION Module,CODE
  20.  
  21. Printf.SPrintf0:
  22.   moveq   #0,d7
  23.   bra.s   Printf_SPrintf
  24. Printf.SPrintf1:
  25.   moveq   #1,d7
  26.   bra.s   Printf_SPrintf
  27. Printf.SPrintf2:
  28.   moveq   #2,d7
  29.   bra.s   Printf_SPrintf
  30. Printf.SPrintf3:
  31.   moveq   #3,d7
  32.   bra.s   Printf_SPrintf
  33. Printf.SPrintf4:
  34.   moveq   #4,d7
  35.   bra.s   Printf_SPrintf
  36. Printf.SPrintf5:
  37.   moveq   #5,d7
  38.   bra.s   Printf_SPrintf
  39. Printf.SPrintf6:
  40.   moveq   #6,d7
  41. ;  bra.s   Printf_SPrintf
  42.  
  43. ;--------------------------------------------------------------------
  44.  
  45. ; Register-Belegungen
  46.  
  47. OFFS      EQUR d6                   ; Gesamtlänge der val-Parameter
  48. HIGHS     EQUR d4                   ; HIGH(str)
  49. INDEX     EQUR d3                   ; INDEX für diverse dbra-Schleifen
  50.  
  51. HELP      EQUR a4                   ; Hilfs-Pointer
  52.  
  53. ; Register-Parameter (werden vom Rufer übergeben)
  54. ARGC      EQUR d7                   ; Anzahl val-Parameter
  55.  
  56. HIGHB     EQUR d5                   ; Größe des Ausgabe-Puffers
  57. PUTCHDATA EQUR a3                   ; Daten für PutChar-Prozedur
  58.  
  59. ; Parameter für RawDoFmt
  60. ;PUTCHDATA  EQUR a3 ;               ; Puffer (schon mal definiert)
  61. PROC      EQUR a2                   ; Ausgabe-Prozedur für Zeichen
  62. ARGV      EQUR a1                   ; Argument-Vektor
  63. STR       EQUR a0                   ; Format-String
  64.  
  65.   ; d7 = Anzahl val-Parameter
  66.   ; d5 = HIGH(Buffer)
  67.   ; a3 = ADR(Buffer)
  68.  
  69. Printf_SPrintf:
  70.   movem.l a5/a6,-(sp)               ; a5/a6 retten
  71.   lea     12(sp),HELP               ; Anfang val-Parameter
  72.  
  73.   move.l  ARGC,OFFS                 ; Offset über val-Parameter berechnen
  74.   lsl.l   #2,OFFS
  75.  
  76.   moveq   #0,HIGHS
  77.   moveq   #0,HIGHB
  78.  
  79.   move.w  12(sp,OFFS),HIGHS         ; HIGH(str)
  80.   move.l  14(sp,OFFS),STR           ; str (Format-String)
  81.   move.w  18(sp,OFFS),HIGHB         ; HIGH(buf)
  82.   subq.l  #8,sp
  83.   move.l  sp,PUTCHDATA
  84.   move.l  28(sp,OFFS),(PUTCHDATA)
  85.  
  86. stackCheck:
  87.   move.l  OFFS,d0                   ; Stackbedarf berechnen
  88.   addq.l  #8,d0
  89.   addq.l  #8,d0
  90.   jsr     OberonLib.StackChk
  91.   tst.l   ARGC
  92.   beq.s   print
  93.  
  94. copyArgs:                           ; val-Argumente auf Stack kopieren
  95.   subq.l  #1,ARGC                   ; Sie liegen für die RawDoFmt-Routine
  96. 1$:                                 ; in der falschen Reihenfolge auf dem
  97.   move.l  (HELP)+,-(sp)             ; Stack.
  98.   dbra    ARGC,1$
  99.  
  100.   move.l  sp,ARGV                   ; Neuer Argument-Vektor
  101.  
  102. print:
  103.   move.l  (PUTCHDATA),4(PUTCHDATA)  ; Endadresse des Puffers berechnen
  104.   add.l   HIGHB,4(PUTCHDATA)
  105.  
  106.   lea     PutChProc(pc),PROC        ; Ausgabe-Prozedur für Zeichen
  107.  
  108.   move.l  4,a6                      ; Exec.RawDoFmt aufrufen
  109.   jsr     _LVORawDoFmt(a6)
  110.  
  111.   add.l   #8,sp
  112.   add.l   OFFS,sp
  113.   movem.l (sp)+,a5/a6               ; a5/a6 holen
  114.   move.l  (sp),a0
  115.   lea     16(sp),sp
  116.   add.l   OFFS,sp
  117.   jmp     (a0)
  118.  
  119. ; Diese Prozedur wird von RawDoFmt Aufgerufen.
  120. ; Das Zeichen das ausgegeben werden soll, ist in d0
  121. PutChProc:
  122.   move.l  (PUTCHDATA),a0
  123.   cmp.l   4(PUTCHDATA),a0           ; Ist Ausgabe-Puffer voll ?
  124.   bgt.s   1$
  125.   move.b  d0,(a0)+                  ; Nein: Zeichen in Puffer schreiben
  126.   move.l  a0,(PUTCHDATA)
  127. 1$:
  128.   rts
  129.  
  130.   END
  131.